iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 23
0
自我挑戰組

Android API超初學!!系列 第 23

[Android API] [Day 23] Activity lifecycle (3) - Callback and State

  • 分享至 

  • xImage
  •  

今天一樣接續昨天的話題,來深入了解activity的各種callback,一樣參考官網

先來解答ㄧ些昨天的問題吧:

第一次打開APP,為何呼叫onStart()之後馬上接著onResume()?

以中文的邏輯來看,resume是恢復的意思,所以第一次打開APP,不應該叫做恢復才對。我不確定對英語系國家的人來看是不是沒這種問題,不過官網的解釋是,Created State和Started State都是快速完成且不會停留,真正會停留的是Resumed State。

然後APP就會一直停留在Resumed State,直到有其他事件發生,例如接到電話、轉換activity,螢幕旋轉或關閉等。

打開APP之後再按Home鍵,會呼叫onPause()、onSaveInstanceState(),接著onStop()也被呼叫了?

我想這一樣是中文邏輯的問題,打開APP之後再按Home鍵這個動作,只是讓APP進入背景執行,所以說它是pause(暫停)合理,但說它是stop(停止)就有點太強烈了。

Pause和stop的差別,官網的定義是visibility,如果APP還可以被看見,但不是正在focus的(例如多視窗系統),就是pause;如果看不見就是stop。

另外,onPause()執行的時間很短,所以實作必須簡潔,ㄧ些costly的行為應該在onStop()實作才對。

Paused State是可以停留的,直到APP真的看不見才會轉成Stopped State。

Stopped State時,因為APP看不見了,所以某些資源可以先釋放掉。會設計分成Paused State和Stopped State,應該是為了把UI功能和底層功能切開,所以適當的釋放資源是必要的。

Stopped State時,activity物件還是在記憶體中(但不在window manager中),所以當APP回到Resumed State時,已經建立過的component或layout view物件不用重新建立。

旋轉螢幕onStop()、onDestroy()都被呼叫了?

Destroy聽起來很嚴重啊,只是旋轉個螢幕有必要這樣?官網的解釋是,有兩種情況會呼叫onDestroy():
- APP真的被關掉
- Config發生變化
不過在第二種情況,Config發生變化時,系統會馬上建立一個新的activity物件。

Bundle到底存在哪?

根據官網的說明,Bundle是用來處理process間資料傳遞的,像是IPC/Binder transactions,或是帶有intent的activity之間的傳輸,或是當config變化時儲存資料。關於bundle有很多東西需要釐清,明天繼續吧!
/images/emoticon/emoticon42.gif


上一篇
[Android API] [Day 22] Activity lifecycle (2) - Bundle/Other callbacks
下一篇
[Android API] [Day 24] Activity lifecycle (4) - Process
系列文
Android API超初學!!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言